/**
 * 全局错误处理中间件
 * 统一处理API错误响应格式
 */
const errorHandler = (err, req, res, next) => {
  console.error('错误:', err);

  // 默认错误状态码和消息
  let statusCode = 500;
  let message = '服务器内部错误';
  let details = null;

  // 根据错误类型设置适当的状态码和消息
  if (err.name === 'SequelizeValidationError' || err.name === 'SequelizeUniqueConstraintError') {
    // Sequelize验证错误
    statusCode = 400;
    message = '数据验证失败';
    details = err.errors.map(e => ({
      field: e.path,
      message: e.message
    }));
  } else if (err.name === 'JsonWebTokenError') {
    // JWT错误
    statusCode = 401;
    message = '无效的认证令牌';
  } else if (err.name === 'TokenExpiredError') {
    // JWT过期错误
    statusCode = 401;
    message = '认证令牌已过期';
  } else if (err.statusCode) {
    // 自定义错误状态码
    statusCode = err.statusCode;
    message = err.message || message;
  } else if (err.message) {
    // 其他错误但有消息
    message = err.message;
  }

  // 开发环境下提供更多错误详情
  const devInfo = process.env.NODE_ENV === 'development' ? {
    stack: err.stack,
    name: err.name
  } : null;

  // 发送错误响应
  res.status(statusCode).json({
    code: statusCode,
    success: false,
    message,
    details,
    ...(devInfo && { dev: devInfo })
  });
};

module.exports = errorHandler;